#!/bin/bash

# 确保传入两个参数
if [ $# -ne 3 ]; then
    echo "Usage: $0 <PORT_VAL> <JAR_NAME> <ENV>"
    exit 1
fi

# 接收参数
PORT_VAL=$1
JAR_NAME=$2
ENV=$3

echo "启动服务：$JAR_NAME"
echo "端口：$PORT_VAL"
echo "环境：$ENV"

echo "构建模块: $JAR_NAME - $ENV"
#定义变量
# jar 包存放的路径
JAR_PATH="/data/shaozj/server"


#新镜像的名称
timestamp=$(date +%Y%m%d%H%M)
NEW_IMAGE_NAME=$JAR_NAME:$timestamp

#项目的生产环境配置

#进入指定目录
cd $JAR_PATH || { echo 'Failed to change directory'; exit 1;}
# 1.先构建新的镜像
echo "########## 开始构建新镜像: $NEW_IMAGE_NAME #####################"
docker build -t $NEW_IMAGE_NAME --build-arg ENV=$ENV --build-arg JARNAME=$JAR_NAME --build-arg JARPORT=$PORT_VAL .
if [ $? -ne 0 ]; then #判断上一个指令退出的状态码 0标识执行成功
  echo "构建镜像 $NEW_IMAGE_NAME 失败"
  exit 1
else
  echo "构建镜像 $NEW_IMAGE_NAME 成功"
fi
# 2.新镜像构建成功后，停止并删除之前运行的容器
echo "########## 正在停止并删除之前运行的容器... #####################"
RUNNING_CONTAINER_ID=$(docker ps | grep "$JAR_NAME" | awk '{print $1}')
echo "########## 停止的容器.  ##################### $RUNNING_CONTAINER_ID"
if [ -n "$RUNNING_CONTAINER_ID" ]; then
  docker stop "$RUNNING_CONTAINER_ID"
  echo "容器 $RUNNING_CONTAINER_ID 已停止"
  docker rm "$RUNNING_CONTAINER_ID"
  echo "容器 $RUNNING_CONTAINER_ID 已删除"
fi

#3. 停止之前运行的容器后，删除旧的镜像
OLD_IMAGE_TAGS=$( docker images | grep "$JAR_NAME" | awk '{print $2}' | grep -v "$timestamp" | sort | uniq)
echo "########## 删除旧镜像... #####################$OLD_IMAGE_TAGS"
# 删除旧镜像
if [ -n "$OLD_IMAGE_TAGS" ]; then
  for tag in $OLD_IMAGE_TAGS; do
    docker rmi "${JAR_NAME}:${tag}"
    echo "旧镜像 ${JAR_NAME}:${tag} 已删除"
  done
else
  echo "没有旧镜像需要删除"
fi

#4. 在宿主机上创建logs目录，用于容器挂载，这样查看日志可以直接在宿主机查看，比较方便
echo "########## 创建日志目录... $JAR_PATH/logs #####################"
mkdir -p $JAR_PATH/logs

#5. 删除旧的镜像后运行新的容器
docker run -d --name $JAR_NAME -p "$PORT_VAL:$PORT_VAL" --restart=always -v "$JAR_PATH/logs/$JAR_NAME:/app/logs/$JAR_NAME" "$NEW_IMAGE_NAME"
if [ $? -eq 0 ]; then
  echo "新容器运行成功"
else
  echo "新容器运行失败"
  exit 1
fi



